package com.zy.explore.sys.domain.mybatis.entity;

import com.zy.explore.common.infrastructure.base.mybatis.MpBaseEntity;
import com.zy.explore.common.infrastructure.util.StrUtil;
import com.zy.explore.sys.interfaces.frm.VisitLogQueryFrm;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.Date;
import org.springframework.util.StringUtils;
import java.util.stream.Collectors;

/**
 * 表(sys_visit_log)对应的Mybatis ORM实体对象
 *
 * @author 🇨🇳中国印🇨🇳
 * @date 2022年02月01日 17:19:01
 */
@Slf4j
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_visit_log")
@Table(name = "sys_visit_log")
public class VisitLog extends MpBaseEntity<VisitLog, String> {

    /**
     * 主键
     */
    @Id
    @TableId(type = IdType.ID_WORKER)
    @Column(name = "id")
    private String id;

    /**
     * 名称
     */
    @Column(name = "name")
    private String name;

    /**
     * 是否执行成功（Y-是，N-否）
     */
    @Column(name = "success")
    private String success;

    /**
     * 具体消息
     */
    @Column(name = "message")
    private String message;

    /**
     * ip
     */
    @Column(name = "ip")
    private String ip;

    /**
     * 地址
     */
    @Column(name = "location")
    private String location;

    /**
     * 浏览器
     */
    @Column(name = "browser")
    private String browser;

    /**
     * 操作系统
     */
    @Column(name = "os")
    private String os;

    /**
     * 操作类型（字典 1登入 2登出）
     */
    @Column(name = "vis_type")
    private Integer visType;

    /**
     * 访问时间
     */
    @Column(name = "vis_time")
    private Date visTime;

    /**
     * 访问账号
     */
    @Column(name = "account")
    private String account;

    /**
     * 签名数据（除ID外）
     */
    @Column(name = "sign_value")
    private String signValue;


    /**
     * 组装查询条件
     *
     * @param frm 请求参数
     * @return {@link Wrapper<VisitLog> }
     */
    public static Wrapper<VisitLog> getWrapper(VisitLogQueryFrm frm) {
        // TODO 请按实际需求组装查询条件
        log.warn("TODO 请按实际需求组装查询条件");
        if (frm.getPageNum() == null || frm.getPageNum() <= 0) {
            frm.setPageNum(1);
        }
        if (frm.getPageSize() == null || frm.getPageSize() <= 0) {
            frm.setPageSize(10);
        }
        Wrapper<VisitLog> wrapper = new EntityWrapper<>();
        if(frm.getId() != null) {
            wrapper.eq(StrUtil.humpToUnderline("id"), frm.getId());
        }
        if (!StringUtils.isEmpty(frm.getName())) {
            wrapper.like(StrUtil.humpToUnderline("name"), frm.getName() + "%");
        }
        if (!StringUtils.isEmpty(frm.getSuccess())) {
            wrapper.like(StrUtil.humpToUnderline("success"), frm.getSuccess() + "%");
        }
        if (!StringUtils.isEmpty(frm.getMessage())) {
            wrapper.like(StrUtil.humpToUnderline("message"), frm.getMessage() + "%");
        }
        if (!StringUtils.isEmpty(frm.getIp())) {
            wrapper.like(StrUtil.humpToUnderline("ip"), frm.getIp() + "%");
        }
        if (!StringUtils.isEmpty(frm.getLocation())) {
            wrapper.like(StrUtil.humpToUnderline("location"), frm.getLocation() + "%");
        }
        if (!StringUtils.isEmpty(frm.getBrowser())) {
            wrapper.like(StrUtil.humpToUnderline("browser"), frm.getBrowser() + "%");
        }
        if (!StringUtils.isEmpty(frm.getOs())) {
            wrapper.like(StrUtil.humpToUnderline("os"), frm.getOs() + "%");
        }
        if(frm.getVisType() != null) {
            wrapper.eq(StrUtil.humpToUnderline("visType"), frm.getVisType());
        }
        if(!StringUtils.isEmpty(frm.getVisTimeBegin())) {
            wrapper.ge(StrUtil.humpToUnderline("visTime"), frm.getVisTimeBegin());
        }
        if(!StringUtils.isEmpty(frm.getVisTimeEnd())) {
            wrapper.le(StrUtil.humpToUnderline("visTime"), frm.getVisTimeEnd());
        }
        if (!StringUtils.isEmpty(frm.getAccount())) {
            wrapper.like(StrUtil.humpToUnderline("account"), frm.getAccount() + "%");
        }
        if (!StringUtils.isEmpty(frm.getSignValue())) {
            wrapper.like(StrUtil.humpToUnderline("signValue"), frm.getSignValue() + "%");
        }
        return wrapper;
    }
}